﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dominio;
using System.Data;
using System.Data.Objects;

namespace Persistencia
{
    public class EventoPersistencia
    {
      
        public void InsertarEvento(Evento evento)
        {
            using (OlimpycsLondonEntities entities = new OlimpycsLondonEntities())
            {
                EVENTO eventoDB = GetEventoEntity(evento);
                entities.EVENTO.AddObject(eventoDB);

                foreach (Participante participante in evento.Participantes)
                {
                    EVENTO_PARTICIPANTE evento_participante = new EVENTO_PARTICIPANTE();
                    evento_participante.PARTICIPANTE = participante.Id;
                    evento_participante.EVENTO = eventoDB.ID;
                    entities.EVENTO_PARTICIPANTE.AddObject(evento_participante);
                }

                foreach (Resultado resultado in evento.Resultados)
                {
                    EVENTO_RESULTADO evento_resultado = new EVENTO_RESULTADO();
                    evento_resultado.PARTICIPANTE= resultado.Participante.Id;
                    evento_resultado.RESULTADO = resultado.Posicion;
                    evento_resultado.EVENTO = eventoDB.ID;
                    entities.EVENTO_RESULTADO.AddObject(evento_resultado);
                }

                entities.SaveChanges();
            }
        }

        public void ModificarEventoDatosPrincipales(Evento evento)
        {
            using (OlimpycsLondonEntities entities = new OlimpycsLondonEntities())
            {
                EVENTO eventoDB = entities.EVENTO.FirstOrDefault(d => d.ID == evento.Id);
                eventoDB.FECHAHORA = evento.FechaHora;
                eventoDB.DEPORTE = evento.Deporte.Id;                               

                entities.SaveChanges();
            }
        }

        public void ModificarEventoParticipantes(Evento evento)
        {
            EliminarTodosEventosParticipantes(evento);
            EliminarTodosEventosResultados(evento);

            using (OlimpycsLondonEntities entities = new OlimpycsLondonEntities())
            {
                foreach (Participante participante in evento.Participantes)
                {
                    EVENTO_PARTICIPANTE evento_participante = new EVENTO_PARTICIPANTE();
                    evento_participante.PARTICIPANTE = participante.Id;
                    evento_participante.EVENTO = evento.Id;
                    entities.EVENTO_PARTICIPANTE.AddObject(evento_participante);
                }

                entities.SaveChanges();
            }
        }

        public void ModificarEventoResultados(Evento evento)
        {
            EliminarTodosEventosResultados(evento);

            using (OlimpycsLondonEntities entities = new OlimpycsLondonEntities())
            {
                foreach (Resultado resultado in evento.Resultados)
                {
                    EVENTO_RESULTADO evento_resultado = new EVENTO_RESULTADO();
                    evento_resultado.PARTICIPANTE = resultado.Participante.Id;
                    evento_resultado.RESULTADO = resultado.Posicion;
                    evento_resultado.EVENTO = evento.Id;
                    entities.EVENTO_RESULTADO.AddObject(evento_resultado);
                }

                entities.SaveChanges();
            }
        }

        private void EliminarTodosEventosResultados(Evento evento)
        {
            using (OlimpycsLondonEntities entities = new OlimpycsLondonEntities())
            {
                List<EVENTO_RESULTADO> eventoResultados = ((from e in entities.EVENTO
                                                            join er in entities.EVENTO_RESULTADO on e.ID equals er.EVENTO
                                                                  where e.ID == evento.Id
                                                            select er) as ObjectQuery<EVENTO_RESULTADO>).ToList();

                foreach (EVENTO_RESULTADO resultadoBD in eventoResultados)
                {
                    entities.EVENTO_RESULTADO.DeleteObject(resultadoBD);
                }
                entities.SaveChanges();
            }
        }

        private void EliminarTodosEventosParticipantes(Evento evento)
        {

            using (OlimpycsLondonEntities entities = new OlimpycsLondonEntities())
            {
                List<EVENTO_PARTICIPANTE> eventoParticipantes = ((from e in entities.EVENTO
                                                                  join ep in entities.EVENTO_PARTICIPANTE on e.ID equals ep.EVENTO
                                                                     where e.ID == evento.Id
                                                                  select ep) as ObjectQuery<EVENTO_PARTICIPANTE>).ToList(); 
 
                foreach (EVENTO_PARTICIPANTE participanteBD in eventoParticipantes)
                {
                    entities.EVENTO_PARTICIPANTE.DeleteObject(participanteBD);
                }
                entities.SaveChanges();
            }
        }

        private void EliminarTodosEventosVideos(Evento evento)
        {
            using (OlimpycsLondonEntities entities = new OlimpycsLondonEntities())
            {
                List<VIDEO_EVENTO> eventoVideos = ((from e in entities.EVENTO
                                                    join ev in entities.VIDEO_EVENTO on e.ID equals ev.EVENTO
                                                                  where e.ID == evento.Id
                                                    select ev) as ObjectQuery<VIDEO_EVENTO>).ToList();

                foreach (VIDEO_EVENTO videoEventoBD in eventoVideos)
                {
                    entities.VIDEO_EVENTO.DeleteObject(videoEventoBD);
                }
                entities.SaveChanges();
            }
        }

        public void EliminarEvento(Evento evento)
        {
            EliminarTodosEventosParticipantes(evento);
            EliminarTodosEventosResultados(evento);
            EliminarTodosEventosVideos(evento);

            using (OlimpycsLondonEntities entities = new OlimpycsLondonEntities())
            {
                EVENTO eventoDB = entities.EVENTO.FirstOrDefault(e => e.ID == evento.Id);
                entities.EVENTO.DeleteObject(eventoDB);

                entities.SaveChanges();
            }
        }

        public List<Evento> GetEventos()
        {
            List<Evento> eventos = new List<Evento>();

            using (OlimpycsLondonEntities entities = new OlimpycsLondonEntities())
            {
                List<EVENTO> eventosDB = entities.EVENTO.ToList();
                Evento evento = null;
                foreach (EVENTO eventoDB in eventosDB)
                {
                    evento = GetEventoDomain(eventoDB);
                    eventos.Add(evento);
                }
            }

            return eventos;
        }

        public Evento GetEvento(int eventoId)
        {
            Evento evento = null;

            using (OlimpycsLondonEntities entities = new OlimpycsLondonEntities())
            {
                EVENTO eventoDB = entities.EVENTO.FirstOrDefault(e => e.ID == eventoId);
                evento = GetEventoDomain(eventoDB);
            }

            return evento;
        }

        public DataSet GetEventosPorDeporte()
        {
            throw new NotImplementedException();
        }

        public DataSet GetResultadosMedallasPorPais()
        {
            
            throw new NotImplementedException();
        }

        internal EVENTO GetEventoEntity(Evento evento)
        {
            EVENTO eventoEntity = new EVENTO();

            eventoEntity.FECHAHORA = evento.FechaHora;
            eventoEntity.DEPORTE = evento.Deporte.Id;

            return eventoEntity;
        }

        internal Evento GetEventoDomain(EVENTO eventoEntity)
        {
            Evento evento = new Evento();
            evento.Id = eventoEntity.ID;
            evento.FechaHora = eventoEntity.FECHAHORA;

            evento.Deporte = DeportePersistencia.GetDeporteDomain(eventoEntity.DEPORTE1);

            foreach (EVENTO_PARTICIPANTE evento_participante in eventoEntity.EVENTO_PARTICIPANTE)
            {
                evento.Participantes.Add(AtletaEquipoPersistencia.GetParticipanteDomain(evento_participante.PARTICIPANTE1));
            }

            foreach (EVENTO_RESULTADO evento_resultado in eventoEntity.EVENTO_RESULTADO)
            {
                Participante participanteResultado = AtletaEquipoPersistencia.GetParticipanteDomain(evento_resultado.PARTICIPANTE1);
                Resultado resultado = new Resultado();
                resultado.Participante = participanteResultado;
                resultado.Id = evento_resultado.ID;
                resultado.Posicion = evento_resultado.RESULTADO;
                evento.Resultados.Add(resultado);
            }

            return evento;
        }

        public List<Evento> GetEventosSimple()
        {
            List<Evento> eventos = new List<Evento>();

            using (OlimpycsLondonEntities entities = new OlimpycsLondonEntities())
            {
                List<EVENTO> eventosDB = entities.EVENTO.ToList();
                Evento evento = null;
                foreach (EVENTO eventoDB in eventosDB)
                {
                    evento = GetEventoDomainSimple(eventoDB);
                    eventos.Add(evento);
                }
            }

            return eventos;
        }

        internal Evento GetEventoDomainSimple(EVENTO eventoEntity)
        {
            Evento evento = new Evento();
            evento.Id = eventoEntity.ID;
            evento.FechaHora = eventoEntity.FECHAHORA;

            evento.Deporte = DeportePersistencia.GetDeporteDomain(eventoEntity.DEPORTE1);

            return evento;
        }
    }
}
